package config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"go.uber.org/zap"
)

var Conf = new(Configuration)

type Configuration struct {
	*App         `mapstructure:"app" json:"app" yaml:"app"`
	*LogConfig   `mapstructure:"log"`
	*MySQLConfig `mapstructure:"mysql"`
	*RedisConfig `mapstructure:"redis"`
}

func Init() (err error) {
	viper.SetConfigFile("config.yaml")
	//viper.SetConfigName("config")
	//viper.SetConfigType("yml")
	viper.AddConfigPath(".")
	err = viper.ReadInConfig()
	if err != nil {

		return
	}

	// 读取的配置反序列化到conf变量中
	err = viper.Unmarshal(Conf)
	if err != nil {
		zap.L().Error("viper.Unmarshal failed, err : %v", zap.Error(err))
		return
	}

	viper.WatchConfig()
	viper.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("配置文件修改了。")
		err = viper.Unmarshal(Conf)
		if err != nil {
			zap.L().Error("viper.Unmarshal failed, err : %v", zap.Error(err))
			return
		}
	})
	zap.L().Info("配置成功！")
	return
}
